package net.ufrog.common.exception;

import net.ufrog.common.app.App;
import net.ufrog.common.utils.Strings;
import net.ufrog.common.utils.Strings.StringSet;

/**
 * 业务异常
 *
 * @author ultrafrog
 * @version 1.0, 2013-4-7
 * @since 1.0
 */
public class ServiceException extends RuntimeException {

    private static final long serialVersionUID 	= 3212842635807077979L;
    private static final String DEFAULT_KEY		= "common.exception";

    /** 代码<br>自动生成作为异常唯一标识 */
    private String code;

    /** 本地消息键值 */
    private String key;

    /** 构造函数 */
    public ServiceException() {
        super();
        generateCode();
    }

    /**
     * 构造函数
     *
     * @param message 消息内容
     */
    public ServiceException(String message) {
        super(message);
        generateCode();
    }

    /**
     * 构造函数
     *
     * @param message 消息内容
     * @param cause 异常对象
     */
    public ServiceException(String message, Throwable cause) {
        super(message, cause);
        generateCode();
    }

    /**
     * 构造函数
     *
     * @param message 消息内容
     * @param key 本地消息键值
     */
    public ServiceException(String message, String key) {
        this(message);
        this.key = key;
    }

    /**
     * 构造函数
     *
     * @param message 消息内容
     * @param key 本地消息键值
     * @param cause 异常对象
     */
    public ServiceException(String message, String key, Throwable cause) {
        this(message, cause);
        this.key = key;
    }

    /**
     * 读取代码
     *
     * @return 代码
     * @see #code
     */
    public String getCode() {
        return code;
    }

    /**
     * 读取本地消息键值
     *
     * @return 本地消息键值
     * @see #key
     */
    public String getKey() {
        return Strings.empty(key, DEFAULT_KEY);
    }

    @Override
    public String getMessage() {
        return this.code + " " + super.getMessage();
    }

    @Override
    public String getLocalizedMessage() {
        try {
            return App.message(getKey());
        } catch (NullPointerException e) {
            return getMessage();
        }
    }

    /** 生成代码 */
    private void generateCode() {
        this.code = "@" + Strings.random(16, StringSet.NUMERIC, StringSet.LOWER_ALPHABET, StringSet.UPPER_ALPHABET);
    }
}
